package com.vlyman.code.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.vlyman.code.consts.Consts;
import com.vlyman.code.utils.YamlReader;

import java.util.ArrayList;
import java.util.List;

/**
 * 类描述：
 *  代码生成器通用配置
 * @author chenjs
 * @date 2018/12/12 12:41
 **/
public class CommonConfig {

    private static String projectPath = System.getProperty("user.dir");
    private static GlobalConfig gc;
    private static DataSourceConfig dsc;
    private static PackageConfig pc;
    private static TemplateConfig tc;
    private static InjectionConfig icfg;
    private static StrategyConfig sc;

    /**
     * 方法描述：
     *   初始化全局策略globalConfig配置
     *  @author chenjs
     *  @return GlobalConfig
     *  @date 2018/12/12 12:43
     */
    public static GlobalConfig initGlobalConfig() {
        gc = new GlobalConfig();
        gc.setOutputDir(projectPath + YamlReader.getValue("config.global.output-path"));
        gc.setAuthor(YamlReader.getValue("config.global.author"));
        gc.setOpen(false);
        gc.setMapperName("%sDao");
        gc.setXmlName("%sDao");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setControllerName("%sController");
        gc.setBaseResultMap(true);
        return gc;
    }

    /**
     * 方法描述：
     *   初始化数据源dataSourceConfig配置
     *  @author chenjs
     *  @return DataSourceConfig
     *  @date 2018/12/12 16:06
     */
    public static DataSourceConfig initDataSourceConfig() {
        dsc = new DataSourceConfig();
        dsc.setUrl(YamlReader.getValue("datasource.url"));
        dsc.setDriverName(YamlReader.getValue("datasource.driver-name"));
        dsc.setUsername(YamlReader.getValue("datasource.username"));
        dsc.setPassword(YamlReader.getValue("datasource.password"));
        dsc.setDbType(DbType.getDbType(YamlReader.getValue("datasource.db-type")));
        return dsc;
    }

    /**
     * 方法描述：
     *   初始化包名配置
     *  @author chenjs
     *  @param moduleName
     *  @return PackageConfig
     *  @date 2018/12/12 16:18
     */
    public static PackageConfig initPackageConfig(String moduleName) {
        pc = new PackageConfig();
        pc.setParent(YamlReader.getValue("package.parent"));
        pc.setModuleName(moduleName);
        pc.setEntity("model.entity");
        pc.setMapper("dao");
        return pc;
    }

    /**
     * 方法描述：
     *   初始化代码模板
     *  @author chenjs
     *  @return TemplateConfig
     *  @date 2018/12/13 12:28
     */
    public static TemplateConfig initTemplateConfig() {
        tc = new TemplateConfig();
        tc.setController(Consts.VLYMAN_CONTROLLER_TEMPLATE_PATH);
        tc.setEntity(Consts.VLYMAN_ENTITY_TEMPLATE_PATH);
        tc.setMapper(Consts.VLYMAN_MAPPER_TEMPLATE_PATH);
        //mapper.xml另外输出到别的地方，使用自定义注入配置，这里set成NULL值
        tc.setXml(null);
        tc.setService(Consts.VLYMAN_SERVICE_TEMPLATE_PATH);
        tc.setServiceImpl(Consts.VLYMAN_SERVICEIMPL_TEMPLATE_PATH);
        return tc;
    }

    /**
     * 方法描述：
     *   初始化自定义注入配置
     *  @author chenjs
     *  @return InjectionConfig
     *  @date 2018/12/12 16:45
     */
    public static InjectionConfig initInjectionConfig() {
        icfg = new InjectionConfig() {
            @Override
            public void initMap() {

            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig(Consts.VLYMAN_MAPPER_XML_TEMPLATE_PATH.concat(Consts.FREEMARK_FILE_SUFFIX)) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称
                return projectPath
                        .concat(YamlReader.getValue("injection.mapper-xml-path"))
                        .concat(pc.getModuleName())
                        .concat("/")
                        .concat(tableInfo.getEntityName())
                        .concat("Mapper")
                        .concat(StringPool.DOT_XML);
            }
        });
        icfg.setFileOutConfigList(focList);
        return icfg;
    }

    /**
     * 方法描述：
     *   初始化数据库表配置，通过该配置，可指定需要生成哪些表或者排除哪些表
     *  @author chenjs
     *  @param include 需要包含的表名，允许正则表达式
     *  @return StrategyConfig
     *  @date 2018/12/12 17:02
     */
    public static StrategyConfig initStrategyConfig(String include) {
        sc = new StrategyConfig();
        sc.setSkipView(true);
        sc.setTablePrefix("t_");
        sc.setNaming(NamingStrategy.underline_to_camel);
        sc.setColumnNaming(NamingStrategy.nochange);
        sc.setEntityLombokModel(true);
        sc.setInclude(include);
        sc.setControllerMappingHyphenStyle(true);
        return sc;
    }
}
